package com.cnc.common.web.util;

import javassist.bytecode.SignatureAttribute;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * 作者：Teacher_Huang
 * 创建时间：2017-09-27.
 * 版本：1.0
 */
public class AOPUtils {

    /**
     * 通过AOP切面获取拦截到的方法
     * @param pjp
     * @return
     */
    public static Method getMethod(ProceedingJoinPoint pjp){
        //拦截的实体类
        Object targe = pjp.getTarget();
        //拦截的方法名称
        String methodName = pjp.getSignature().getName();
        //拦截的方法参数
        Object[] args = pjp.getArgs();
        //拦截的放参数类型
        MethodSignature methodSignature  = (MethodSignature) pjp.getSignature();//拿到方法签名
        //methodSignature.getReturnType();//获取方法返回类型
        Class[] parameterTypes = methodSignature.getMethod().getParameterTypes();//拿到方法签名后拿到方法，再拿到方法参数
        Method method = null;
        try {
            //通过反射获取拦截到的method
            method = targe.getClass().getMethod(methodName, parameterTypes);
            //如果是桥则要获取实际拦截的method
            if(method.isBridge()){
                for (int i = 0 ; i < args.length ; i++){
                    //获取泛型类型
                    Class genClazz = targe.getClass().getGenericSuperclass().getClass();
                    if(args[i].getClass().isAssignableFrom(genClazz)){
                        parameterTypes[i] = genClazz;
                    }
                }
                //获得parameterType参数类型得方法
                method = targe.getClass().getMethod(methodName, parameterTypes);
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return method;
    }

    public static int getValueByType(Class<?> clazz,Parameter[] parameters){
        int index  = -1;
        for (int i = 0; i < parameters.length; i++) {
            if(parameters[i].getType().getName().equals(clazz.getName())){
                return i;
            }
        }
        return index;
    }
}
